// 已知一个表示学生的结构体，有如下四个成员：
//    姓名（最多占20字节）
//    性别
//    年龄
//    成绩
//    写程序定义一个该结构体类型的数组，数组大小为6，
//    请先按成绩从高到低排序该数组然后写入到一个文件中，
//    然后再将成绩低于60的学生从文件中读到一个动态数组中，
//    最后输出该动态数组的内容
//    注：1). 文件操作用系统调用函数
//        2). 文件名通过命令行传入程序
//        3). 排序用qsort
//        4). 结构体数组内容通过初始化设置
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
typedef struct STU
{
    char name[20];
    char sex[10];
    int age;
    float score;
}STU;

int sortByScore(STU*a,STU*b)
{
    if(a->score > b->score)
    {
        return 1;
    }
    else if (a->score < b->score)
    {
        return -1;
    }
    return 0; 
}

int main(int argc,char*argv[])
{
    // if(argc < 2)
	// {
	// 	printf("argument too few in %s at %d\n",__FILE__,__LINE__);
	// 	return 1;
	// }

    STU stu[6]={{"A","male",20,38.3},{"B","female",22,78.4},{"C","male",26,49.1},{"D","female",29,70.6},{"E","male",21,55.4},{"F","female",24,92.7}};

    char filename[10]={'\0'};
    char a[]="请输入文件名:\n";
    int fd=-1;
    int i=0;
    

    //printf("ok\n");

    write(1,a,21);
    read(0,filename,10);

    //printf("len = %ld\n",strlen(filename));
    filename[strlen(filename)-1]='\0';
    //printf("\n");
    //printf("filename = %s\n",filename);

    fd = open(filename,O_CREAT);
    if(fd < 0)
	{
		printf("Open %s failed,in %s at %d\n",argv[1],__FILE__,__LINE__);
		return 1;
	}

    qsort(stu,6,sizeof(STU),sortByScore);

    for(i=0;i<6;i++)
    {
        write(fd,&stu[i],sizeof(STU));
    }

    printf("文件保存成功!");

	close(fd);
	fd = -1;
    return 0;
}